package com.fpno.preparedStatement.crud;

import com.fpno.bean.Customer;
import com.fpno.util.JDBCUtils;
import org.junit.Test;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

/*
* 使用PreparedStatement完成不同表的查询
* */
public class PrepareddStatementQueryTest {
    @Test
    public void testGetForList() throws Exception{
//        name,email,birth 不能使用*
        String sql="select name from customers where id=? ";
        List<Customer> list = getForList(Customer.class, sql,7);
        list.forEach(System.out::println);
    }



    public<T> List<T> getForList(Class<T> clazz,String sql,Object...args) throws Exception{
        Connection connection = JDBCUtils.getConnection();
        PreparedStatement ps = connection.prepareStatement(sql);
        for (int i = 0; i < args.length; i++) {
            ps.setObject(i+1,args[i]);
        }
        ResultSet resultSet = ps.executeQuery();
        //获取结果集的元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        //通过ResultSetMetaData获取结果集中的列数
        int columnCount = metaData.getColumnCount();
        //创建集合对象
        ArrayList<T> list=new ArrayList<T>();
        while (resultSet.next()){
            T t =  clazz.newInstance();
            //处理结果集一行数据中的每一个列
            for (int i=0;i<columnCount;i++){
                Object columnValue = resultSet.getObject(i + 1);
                //获取每个列的列名
                String columnName = metaData.getColumnLabel(i+1);
                //给customer对象指定的某个属性赋值为columnValue,通过反射
                Field field = clazz.getDeclaredField(columnName);
                /*当类的某个属性或方法的访问权限为private的时候，可以利用setAccessible方法设置
java的访问权限*/
                field.setAccessible(true);
                field.set(t,columnValue);
            }
            list.add(t);
        }
        JDBCUtils.closeResource(connection,ps,resultSet);
        return list;
    }




    @Test
    public void testGetInstance() throws Exception {
        String sql="select id,name,email from customers where id=?";
        Customer customer = getInstance(Customer.class, sql, 7);
        System.out.println(customer);
    }

/*返回一条查询记录*/
    public<T> T getInstance(Class<T> clazz,String sql,Object ...args) throws Exception{
        Connection connection = JDBCUtils.getConnection();
        PreparedStatement ps = connection.prepareStatement(sql);
        for (int i = 0; i < args.length; i++) {
            ps.setObject(i+1,args[i]);
        }
        ResultSet resultSet = ps.executeQuery();
        //获取结果集的元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        //通过ResultSetMetaData获取结果集中的列数
        int columnCount = metaData.getColumnCount();
        if (resultSet.next()){
            T t = clazz.newInstance();
            //处理结果集一行数据中的每一个列
            for (int i=0;i<columnCount;i++){
                Object columnValue = resultSet.getObject(i + 1);
                //获取每个列的列名
                String columnName = metaData.getColumnLabel(i+1);
                //给customer对象指定的某个属性赋值为columnValue,通过反射
                Field field = clazz.getDeclaredField(columnName);
                /*当类的某个属性或方法的访问权限为private的时候，可以利用setAccessible方法设置
java的访问权限*/
                field.setAccessible(true);
                field.set(t,columnValue);
            }
            JDBCUtils.closeResource(connection,ps,resultSet);
            return t;
        }
        JDBCUtils.closeResource(connection,ps,resultSet);
        return null;

    }
}
